TAMU CTF 逆向有简单也有复杂的,前天刚结束,今天把这个总结一下。
附上题目,提取码rb8rhttps://pan.baidu.com/s/1A5G-pRd3oYkzVYVJDVIxvQ

Cheesy

文件放到Ubuntu中运行一遍,发现采用了base64编码,把给出的加密代码解密,并没有发现flag,并且解密之后告诉你你已经错过了flag,所以考虑,是否还有未解密的隐藏代码,放到ida中发现了

1
Z2lnZW17M2E1eV9SM3YzcjUxTjYhfQ==

这一串密码未输出,经过解密就是flag

1
gigem{3a5y_R3v3r51N6!}

Snakes over cheese

给的是一个.pyc文件,用uncompyle反编译一下得到.py文件,使用命令

1
uncompyle6 reversing2.pyc > reversing2.py

的得到如下的py文件,运行一下发现需要输入正确的密码才能给你flag
不用那么麻烦的把密码给逆向出来,直接修改一下py文件直接得出flag
运行结果如下:

042

这是一道真正的反汇编,给的文件不能编译所以要纯看汇编代码,但是这个汇编代码还是很简单的,前面第一个function是一个迷惑代码,实质上没用,主要看main函数,关键代码在如下地方
在第二printf函数后面放入的是栈中[rbp-16]的地址,即从[rbp-16]向下取值回到上面就能看到存入栈中的值,即可获得flag

1
gigem{A553Mb1Y}

keygenme

把enc()这个函数逆向就完了,但是有一个需要注意的地方,这里输入的a1在运行过程中strlen()函数包含了输入时的回车符’\n’所以根据得到v5知道a1的长度应该是17,但是包含了最后的回车符,所以a1只有16个,脚本如下
提交就能得到flag,比赛的时候一直没有想到这个问题,知道是多了个’Enter’但是实在没想到是这样,比赛结束后用C语言正着证明了一遍

#NoCCBytes#
放到ida里面re了一下发现答案在globPass中,显然DATA中的字符串肯定不是,但是我们可以动态调试啊,但是文件开了保护机制,所以下断点的时候要绕开这些保护机制,所以直接一点直接把断点下在字符串比较的地方。然后就看到内存中的golbpass

满眼答案…提交就能得到flag